# 2023-02-04
import json
import os
from msvcrt import getwch as m


def main():
    '''选择数据库,表格以及保存,加载内容.'''
    global file,file_flag,q,b,t
    os.system("cls||clear")
    file_flag_c="已打开,未s保存" if file_flag else "已关闭,需要打开"
    print(f"?帮助\no文档 {file} {file_flag_c}")
    print("b数据库:")
    for ib in q.keys():
        if ib==b:
            print('<',ib,'>',end="  ")
        else:
            print(ib,end="  ")
    print("\nt表格:")
    if b in q.keys():
        for it in q[b].keys():
            if it==t:
                print('<',it,'>',end="  ")
            else:
                print(it,end="  ")
    promit=q.get(b,False) and q[b].get(t,False)
    if promit:
        print("""
现在输入空格可以进入表格了!
输入k修改表头""")
    else:
        print("""
请选择数据库和表格""")
    c=m()
    if c=='q':
        return 0
    elif c=='o':
        return 4
    elif c=='s':
        return 5
    elif c=='?':
        return 6
    if file_flag:
        if c=='b':
            b=input('输入数据库:')
            q.setdefault(b,{})
        elif c=='x':
            i=0
            for ikey in q.keys():
                print(i,ikey)
                i+=1
            del_b=input("输入数字删除:")
            if '0'<=del_b<'len(q)':
                q.pop(list(q.keys())[int(del_b)])
        elif q.get(b,False) and c=='d':
            i=0
            for ikey in q[b].keys():
                print(i,ikey)
                i+=1
            del_t=input("输入数字删除:")
            if '0'<=del_t<'len(q[b])':
                q[b].pop(list(q[b].keys())[int(del_t)])
        elif c=='t':
            t=input('输入表格:')
            q[b].setdefault(t,[[['*']],['*']])
        if promit:
            if c==' ':
                return 2
            elif c=='k':
                return 3
    return 1

def fda():
    '''控制表格'''
    global q,b,t,x,y
    da,ke=q[b][t][:]
    if y<0:
        x,y=x-1,len(ke)-1
    if y>=len(ke):
        x,y=x+1,0
    if x<0:
        x=0
    if x>len(da)-1:
        x=len(da)-1
    out(da,ke,x,y)
    print(f'[{x}-{y}][{q[b][t][0][x][y]}]')
    c=m()
    if c=='0':
        return 0
    elif c=='?':
        help_fda()
    elif 'a'<=c<='z':
        print(c,end='')
        c+=input()
        q[b][t][0][x][y]=c
        y+=1
    elif c=='9':x-=10
    elif c=='3':x+=10
    elif c=='8':x-=1
    elif c=='2':x+=1
    elif c=='4':y-=1
    elif c=='6':y+=1
    elif c=='-' and x!=0:
        q[b][t][0].pop(x)
        x-=1
    elif c=='.':
        i=input('x,y:')
        if len(i2:=i.split(','))==2:i=i2
        elif len(i3:=i.split(' '))==2:i=i3
        elif len(i4:=i.split('.'))==2:i=i4
        else:
            print('输入出错!')
            return 1
        x,y=int(i[0]),int(i[1])
    elif c=='5':
        q[b][t][0][x][y]=input('=')
    elif c=='+':
        q[b][t][0][x][y]+=input('=')
    elif c in('/','*'):
        x,y=len(da),0
        q[b][t][0].append(['*']*len(ke))
        if c=='/':
            for y2 in range(len(ke)):
                if(c2:=input(f'{x}-{y2}='))=='':
                    continue
                q[b][t][0][x][y2]=c2
    return 1

def out(da,ke,x,y):
    '''格式化输出'''
    os.system("cls||clear")
    print(f'Pg:{x//10:<2}|',end='')
    for k in range(len(ke)):
        print(f'({k}){ke[k]:7}',end='')
    print(end='\n')
    for x2 in range(x-x%10,min(x-x%10+10,len(da))):
        print(f'{str(x2):>5}|',end='')
        for y2 in range(len(ke)):
            if (x2,y2)==(x,y):
                print(f'[{da[x2][y2]:8}]',end='')
            else:
                print(f'{da[x2][y2]:10}',end='')
        print(end='\n')

def fke():
    '''控制词头'''
    os.system("cls||clear")
    global q,b,t
    da,ke=q[b][t][:]
    rda=range(len(da))
    lke=len(ke)
    i=0
    for ike in ke:
        print(i,ike)
        i+=1
    c=m()
    if c=='q':
        return 0
    elif c=="?":
        help_fke()
    if c in('/','\\','+') and lke<10:
        q[b][t][1].append(input('+'))
        for i in rda:
            q[b][t][0][i].append('*')
    elif c.isdigit() and 0<=(c:=int(c))<lke:
        q[b][t][1][c]=input(str(ke[c])+'->')
    elif c=='-':
        print('pop=')
        c2=m()
        if c2.isdigit() and (c2:=int(c2))<lke:
            print(f"`{q[b][t][1][c2]}`")
            q[b][t][1].pop(c2)
            for i2 in rda:
                q[b][t][0][i2].pop(c2)
    return 1

def help_main():
    print('''欢迎来到表格程序!
\033[1;36;40m
本软件可以自由复制修改分享!
邮箱:youngasusual@qq.com
\033[0m
直接输入:
o 打开文档
b 打开数据库
x 删除数据库
t 打开表格
d 删除表格
s 保存并退出文档
q 退出
按任意键继续...''')
    m()

def help_fda():
    print('''
说明书:
/=新行并修改 *=新行 -=删除行
       8=上   9=上页
4=左 5=修改  6=右 +=添加
       2=下 3=下页
0=退出 .=跳转
按任意键继续...''')
    m()

def help_fke():
    print('''
说明书:
输入0-9的数重命名那个表头
输入-然后0-9删除那个表头
输入/或+添加表头
输入q退出
按任意键继续...''')
    m()


q:dict={}
file:str="?"
file_flag:bool=False
b:str='?'
t:str='?'
x:int
y:int

help_main()
while fla:=main():
    if fla==2:
        help_fda()
        x,y=0,0
        while fda():pass
    elif fla==3:
        help_fke()
        while fke():pass
    elif fla==4:
        os.system("cls||clear")
        print("路径:",os.getcwd(),"\n你的路径:")
        for i in os.listdir():
            if os.path.isfile(i):
                print(i)
        file=input("输入要打开的文档:")
        if file not in os.listdir():
            open(file,"w").close()
        w=open(file,'r+')
        file_flag=True
        if len(w.read())==0:
            w.write(json.dumps({"base":{"table":[[["*"]],["*"]]}}))
        w.seek(0)
        q=dict(json.loads(w.read()))
        b,t="?","?"
    elif fla==5:
        w.seek(0)
        w.truncate()
        print("写入",w.write(json.dumps(q)))
        w.close()
        file_flag=False
    elif fla==6:
        help_main()